/**
 * 文件相关工具函数
 */

/**
 * 格式化文件大小
 * @param size 文件大小（字节）
 * @returns 格式化后的文件大小字符串
 */
export function formatFileSize(size: number | undefined | null): string {
  if (!size || size === 0) return '0 B'
  
  const units = ['B', 'KB', 'MB', 'GB', 'TB']
  const k = 1024
  const i = Math.floor(Math.log(size) / Math.log(k))
  
  return (size / Math.pow(k, i)).toFixed(i === 0 ? 0 : 1) + ' ' + units[i]
}

/**
 * 格式化日期
 * @param date 日期字符串或Date对象
 * @returns 格式化后的日期字符串
 */
export function formatDate(date: string | Date | undefined | null): string {
  if (!date) return '-'
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return '-'
  
  const now = new Date()
  const diff = now.getTime() - d.getTime()
  const days = Math.floor(diff / (1000 * 60 * 60 * 24))
  
  // 今天
  if (days === 0) {
    return d.toLocaleTimeString('zh-CN', { 
      hour: '2-digit', 
      minute: '2-digit' 
    })
  }
  
  // 昨天
  if (days === 1) {
    return '昨天 ' + d.toLocaleTimeString('zh-CN', { 
      hour: '2-digit', 
      minute: '2-digit' 
    })
  }
  
  // 一周内
  if (days < 7) {
    return `${days}天前`
  }
  
  // 超过一周
  return d.toLocaleDateString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit'
  })
}

/**
 * 根据MIME类型获取文件图标组件名
 * @param mimeType MIME类型
 * @param isFolder 是否为文件夹
 * @returns Element Plus图标组件名
 */
export function getFileIcon(mimeType: string | undefined | null, isFolder?: boolean): string {
  // 如果是文件夹，返回文件夹图标
  if (isFolder) return 'Folder'

  if (!mimeType) return 'Document'
  
  // 图片文件
  if (mimeType.startsWith('image/')) {
    return 'Picture'
  }
  
  // 视频文件
  if (mimeType.startsWith('video/')) {
    return 'VideoPlay'
  }
  
  // 音频文件
  if (mimeType.startsWith('audio/')) {
    return 'Headset'
  }
  
  // 文档文件
  if (mimeType.includes('pdf')) {
    return 'Document'
  }
  
  if (mimeType.includes('word') || mimeType.includes('msword')) {
    return 'Document'
  }
  
  if (mimeType.includes('excel') || mimeType.includes('spreadsheet')) {
    return 'Document'
  }
  
  if (mimeType.includes('powerpoint') || mimeType.includes('presentation')) {
    return 'Document'
  }
  
  // 文本文件
  if (mimeType.startsWith('text/')) {
    return 'Document'
  }
  
  // 压缩文件
  if (mimeType.includes('zip') || mimeType.includes('rar') || mimeType.includes('7z')) {
    return 'Files'
  }
  
  // 代码文件
  if (mimeType.includes('javascript') || 
      mimeType.includes('json') || 
      mimeType.includes('html') || 
      mimeType.includes('css')) {
    return 'Document'
  }
  
  // 默认文件图标
  return 'Document'
}

/**
 * 获取文件类型标签
 * @param mimeType MIME类型
 * @returns 文件类型标签
 */
export function getFileTypeLabel(mimeType: string | undefined | null): string {
  if (!mimeType) return '未知'
  
  if (mimeType.startsWith('image/')) return '图片'
  if (mimeType.startsWith('video/')) return '视频'
  if (mimeType.startsWith('audio/')) return '音频'
  if (mimeType.includes('pdf')) return 'PDF'
  if (mimeType.includes('word') || mimeType.includes('msword')) return 'Word'
  if (mimeType.includes('excel') || mimeType.includes('spreadsheet')) return 'Excel'
  if (mimeType.includes('powerpoint') || mimeType.includes('presentation')) return 'PPT'
  if (mimeType.startsWith('text/')) return '文本'
  if (mimeType.includes('zip') || mimeType.includes('rar') || mimeType.includes('7z')) return '压缩包'
  
  return '文件'
}

/**
 * 获取文件扩展名
 * @param filename 文件名
 * @returns 文件扩展名（不含点号）
 */
export function getFileExtension(filename: string | undefined | null): string {
  if (!filename) return ''
  
  const lastDotIndex = filename.lastIndexOf('.')
  if (lastDotIndex === -1) return ''
  
  return filename.substring(lastDotIndex + 1).toLowerCase()
}

/**
 * 检查是否为图片文件
 * @param mimeType MIME类型
 * @returns 是否为图片文件
 */
export function isImageFile(mimeType: string | undefined | null): boolean {
  return mimeType ? mimeType.startsWith('image/') : false
}

/**
 * 检查是否为视频文件
 * @param mimeType MIME类型
 * @returns 是否为视频文件
 */
export function isVideoFile(mimeType: string | undefined | null): boolean {
  return mimeType ? mimeType.startsWith('video/') : false
}

/**
 * 检查是否为音频文件
 * @param mimeType MIME类型
 * @returns 是否为音频文件
 */
export function isAudioFile(mimeType: string | undefined | null): boolean {
  return mimeType ? mimeType.startsWith('audio/') : false
}

/**
 * 检查是否为文档文件
 * @param mimeType MIME类型
 * @returns 是否为文档文件
 */
export function isDocumentFile(mimeType: string | undefined | null): boolean {
  if (!mimeType) return false
  
  return mimeType.includes('pdf') ||
         mimeType.includes('word') ||
         mimeType.includes('msword') ||
         mimeType.includes('excel') ||
         mimeType.includes('spreadsheet') ||
         mimeType.includes('powerpoint') ||
         mimeType.includes('presentation') ||
         mimeType.startsWith('text/')
}

/**
 * 生成文件预览URL
 * @param fileId 文件ID
 * @param token 访问令牌
 * @returns 预览URL
 */
export function generatePreviewUrl(fileId: string | number, token?: string): string {
  const baseUrl = import.meta.env.VITE_API_BASE_URL || '/api'
  const url = `${baseUrl}/files/${fileId}/preview`
  
  if (token) {
    return `${url}?token=${token}`
  }
  
  return url
}

/**
 * 生成文件下载URL
 * @param fileId 文件ID
 * @param token 访问令牌
 * @returns 下载URL
 */
export function generateDownloadUrl(fileId: string | number, token?: string): string {
  const baseUrl = import.meta.env.VITE_API_BASE_URL || '/api'
  const url = `${baseUrl}/files/${fileId}/download`
  
  if (token) {
    return `${url}?token=${token}`
  }
  
  return url
}

/**
 * 验证文件名
 * @param filename 文件名
 * @returns 验证结果
 */
export function validateFilename(filename: string): { valid: boolean; message?: string } {
  if (!filename || filename.trim().length === 0) {
    return { valid: false, message: '文件名不能为空' }
  }
  
  if (filename.length > 255) {
    return { valid: false, message: '文件名长度不能超过255个字符' }
  }
  
  // 检查非法字符
  const invalidChars = /[<>:"/\\|?*]/
  if (invalidChars.test(filename)) {
    return { valid: false, message: '文件名包含非法字符' }
  }
  
  // 检查保留名称
  const reservedNames = ['CON', 'PRN', 'AUX', 'NUL', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9']
  const nameWithoutExt = filename.split('.')[0].toUpperCase()
  if (reservedNames.includes(nameWithoutExt)) {
    return { valid: false, message: '文件名不能使用系统保留名称' }
  }
  
  return { valid: true }
}
